package dao;

import hibernate.HibernateUtil;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import entity.Vehiculo.*;

public class VehiculoDAO {
	private static VehiculoDAO instancia = null;
	private static SessionFactory sf = null;

	
	public static VehiculoDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new VehiculoDAO();
		} 
		return instancia;
	}
		
	public void altaPlanMantenimiento(Entity_PlanMantenimiento plan){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                session.save(plan);
                session.flush();
                session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Alta Plan Mantenimiento");
        }
	}
	 
	public void modificarPlanMantenimiento(Entity_PlanMantenimiento plan){
        try {
        		Session session=sf.openSession();
        		session.beginTransaction();
        		session.update(plan); 
        		session.getTransaction().commit();
        		session.close();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Modificar Plan Mantenimiento");
        }
	}
	 
	public void bajaPlanMantenimiento(Entity_PlanMantenimiento plan){
        try {
			 	Session session=sf.getCurrentSession();
             	session.beginTransaction();
             	session.delete(plan);
             	session.flush();
             	session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Baja Plan Mantenimiento");
        }
	}
	
	public Entity_PlanMantenimiento getPlanMantenimiento(Integer id){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                Entity_PlanMantenimiento planMantenimiento = (Entity_PlanMantenimiento) session.get(Entity_PlanMantenimiento.class, id);
                session.flush();
                session.getTransaction().commit();
                return planMantenimiento;
        } catch (Exception e) {
                System.out.println(e);
                System.out.println("Error VehiculoDAO. get Plan Mantenimiento");
        }
        return null;
	}
	
	public void altaTareaMantenimientoKilometro(Entity_TareaMantenimientoKilometro tarea){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                session.save(tarea);
                session.flush();
                session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Alta Tarea Mantenimiento Kilometro");
        }
	}
	 
	public void modificarTareaMantenimientoKilometro(Entity_TareaMantenimientoKilometro tarea){
        try {
        		Session session=sf.openSession();
        		session.beginTransaction();
        		session.update(tarea); 
        		session.getTransaction().commit();
        		session.close();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Modificar Tarea Mantenimiento Kilometro");
        }
	}
	 
	public void bajaTareaMantenimientoKilometro(Entity_TareaMantenimientoKilometro tarea){
        try {
			 	Session session=sf.getCurrentSession();
             	session.beginTransaction();
             	session.delete(tarea);
             	session.flush();
             	session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Baja Tarea Mantenimiento Kilometro");
        }
	}
	
	public Entity_TareaMantenimientoKilometro getTareaMantenimientoKilometro(Integer id){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                Entity_TareaMantenimientoKilometro tarea = (Entity_TareaMantenimientoKilometro) session.get(Entity_TareaMantenimientoKilometro.class, id);
                session.flush();
                session.getTransaction().commit();
                return tarea;
        } catch (Exception e) {
                System.out.println(e);
                System.out.println("Error VehiculoDAO. get Tarea Mantenimiento Kilometro");
        }
        return null;
	}
	

	public void altaTareaMantenimientoTiempo(Entity_TareaMantenimientoTiempo tarea){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                session.save(tarea);
                session.flush();
                session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Alta Tarea Mantenimiento Tiempo");
        }
	}
	 
	public void modificarTareaMantenimientoTiempo(Entity_TareaMantenimientoTiempo tarea){
        try {
        		Session session=sf.openSession();
        		session.beginTransaction();
        		session.update(tarea); 
        		session.getTransaction().commit();
        		session.close();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Modificar Tarea Mantenimiento Tiempo");
        }
	}
	 
	public void bajaTareaMantenimientoTiempo(Entity_TareaMantenimientoTiempo tarea){
        try {
			 	Session session=sf.getCurrentSession();
             	session.beginTransaction();
             	session.delete(tarea);
             	session.flush();
             	session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Baja Tarea Mantenimiento Tiempo");
        }
	}
	
	public Entity_TareaMantenimientoTiempo getTareaMantenimientoTiempo(Integer id){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                Entity_TareaMantenimientoTiempo tarea = (Entity_TareaMantenimientoTiempo) session.get(Entity_TareaMantenimientoTiempo.class, id);
                session.flush();
                session.getTransaction().commit();
                return tarea;
        } catch (Exception e) {
                System.out.println(e);
                System.out.println("Error VehiculoDAO. get Tarea Mantenimiento Tiempo");
        }
        return null;
	}
	
	public void altaVehiculo(Entity_Vehiculo vehiculo){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                session.save(vehiculo);
                session.flush();
                session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Alta Vehiculo");
        }
	}
	
	public void modificarVehiculo(Entity_Vehiculo vehiculo){
        try {
        		Session session=sf.openSession();
        		session.beginTransaction();
        		session.update(vehiculo); 
        		session.getTransaction().commit();
        		session.close();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Modificar Vehiculo");
        }
	}
	 
	public void bajaVehiculo(Entity_Vehiculo vehiculo){
        try {
			 	Session session=sf.getCurrentSession();
             	session.beginTransaction();
             	session.delete(vehiculo);
             	session.flush();
             	session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Baja Vehiculo");
        }
	}
	
	public Entity_Vehiculo getVehiculo(Integer id){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                Entity_Vehiculo tarea = (Entity_Vehiculo) session.get(Entity_Vehiculo.class, id);
                session.flush();
                session.getTransaction().commit();
                return tarea;
        } catch (Exception e) {
                System.out.println(e);
                System.out.println("Error VehiculoDAO. get Vehiculo");
        }
        return null;
	}
	public Entity_Vehiculo buscarVehiculo(String patente){
		 Entity_Vehiculo v = null;
        
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                v = (Entity_Vehiculo) session.createQuery("from Entity_Vehiculo v where v.patente= :patente").setParameter("patente", patente).uniqueResult();
                session.flush();
                session.getTransaction().commit();
        } catch (Exception e) {
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Buscar Vehiculo");
        }
        
        return v;
	}
	
	public void altaTareaMantenimientoRealizada(Entity_TareaMantenimientoRealizada tarea){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                session.save(tarea);
                session.flush();
                session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Alta Tarea Mantenimiento Realizada");
        }
	}
	 
	public void modificarTareaMantenimientoRealizada(Entity_TareaMantenimientoRealizada tarea){
        try {
        		Session session=sf.openSession();
        		session.beginTransaction();
        		session.update(tarea); 
        		session.getTransaction().commit();
        		session.close();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Modificar Tarea Mantenimiento Realizada");
        }
	}
	 
	public void bajaTareaMantenimientoRealizada(Entity_TareaMantenimientoRealizada tarea){
        try {
			 	Session session=sf.getCurrentSession();
             	session.beginTransaction();
             	session.delete(tarea);
             	session.flush();
             	session.getTransaction().commit();
        } catch (Exception e){
                System.out.println(e);
                System.out.println("Error VehiculoDAO. Baja Tarea Mantenimiento Realizada");
        }
	}
	
	public Entity_TareaMantenimientoRealizada getTareaMantenimientoRealizada(Integer id){
        try {
                Session session=sf.getCurrentSession();
                session.beginTransaction();
                Entity_TareaMantenimientoRealizada tarea = (Entity_TareaMantenimientoRealizada) session.get(Entity_TareaMantenimientoRealizada.class, id);
                session.flush();
                session.getTransaction().commit();
                return tarea;
        } catch (Exception e) {
                System.out.println(e);
                System.out.println("Error VehiculoDAO. get Tarea Mantenimiento Realizada");
        }
        return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Entity_PlanMantenimiento> listarPlanMantenimiento(){
		try{
	        Session session = sf.openSession();
	        List<Entity_PlanMantenimiento> lista = session.createQuery(" from Entity_PlanMantenimiento").list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar plan mantenimiento");
	   }
	   return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Entity_TareaMantenimiento> listarTareasMantenimiento(Integer idPlanMantenimiento){
		try{
	        Session session = sf.openSession();
	        List<Entity_TareaMantenimiento> lista = session.createQuery("select t from Entity_PlanMantenimiento p join p.tareas t  where p.id = :id").setParameter("id", idPlanMantenimiento).list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar tarea mantenimiento");
	   }
	   return null;
	}
	
	@SuppressWarnings("unchecked")
    public List<Entity_Vehiculo> listarVehiculos() {
            List<Entity_Vehiculo> lista=new ArrayList<Entity_Vehiculo>();
            
            try {
                    Session session=sf.getCurrentSession();
                    session.beginTransaction();
                    lista = session.createQuery("from Entity_Vehiculo").list();
                    session.getTransaction().commit();
            } catch (Exception e) {
                    System.out.println(e);
                    System.out.println("Error VehiculoDAO. Listar Vehiculo");
            }
            
            return lista;	
    }
    
    @SuppressWarnings("unchecked")
    public List<Entity_Vehiculo> listarVehiculos(Integer idSucursal) {
            List<Entity_Vehiculo> lista=new ArrayList<Entity_Vehiculo>();
            
            try {
                    Session session=sf.getCurrentSession();
                    session.beginTransaction();
                    lista = session.createQuery("select v from Entity_Vehiculo v where v.sucursal.id = :id").setParameter("id", idSucursal).list();
                    session.getTransaction().commit();
            } catch (Exception e) {
                    System.out.println(e);
                    System.out.println("Error VehiculoDAO. Listar Vehiculo");
            }
            
            return lista;	
    }
	
	
	
	
	
	


    @SuppressWarnings("unchecked")
    public List<Entity_TareaMantenimientoRealizada> listarTareasMentenimientoRealizada(Integer idVehiculo) {
            List<Entity_TareaMantenimientoRealizada> lista=new ArrayList<Entity_TareaMantenimientoRealizada>();
            
            try {
                    Session session=sf.getCurrentSession();
                    session.beginTransaction();
                    lista = session.createQuery("select t from Entity_Vehiculo v join Entity_TareaMantenimientoRealizada t where p.idVehiculo= :id").setParameter("id", idVehiculo).list();
                    session.getTransaction().commit();
            } catch (Exception e) {
                    System.out.println(e);
                    System.out.println("Error VehiculoDAO. Listar Tareas Mantenimiento Realizada");
            }
            
            return lista;	
    }  

    @SuppressWarnings("unchecked")
    public List<Entity_TareaMantenimientoRealizada> listarTareaMantenimientoRealizadaProveedor(Integer idProveedor) {
            List<Entity_TareaMantenimientoRealizada> lista=new ArrayList<Entity_TareaMantenimientoRealizada>();
            try {
                    Session session=sf.getCurrentSession();
                    session.beginTransaction();
                    lista = session.createQuery("select t from Entity_Vehiculo v join v.tareasRealizadas tr where tr.proveedor.id= :id").setParameter("id", idProveedor).list();
                    session.getTransaction().commit();
            } catch (Exception e) {
                    System.out.println(e);
                    System.out.println("Error VehiculoDAO. Listar Tareas Mantenimiento Realizada");
            }
            
            return lista;	
    }
    
    
    
    
    
}
